package com.agile.leetcode.easy;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 对于非负整数 X 而言，X 的数组形式是每位数字按从左到右的顺序形成的数组。例如，如果 X = 1231，那么其数组形式为 [1,2,3,1]。
 * <p>
 * 给定非负整数 X 的数组形式 A，返回整数 X+K 的数组形式。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：A = [1,2,0,0], K = 34
 * 输出：[1,2,3,4]
 * 解释：1200 + 34 = 1234
 *
 * @Author KD
 * @Date 2021/1/27 10:08
 */
public class AddToArrayForm {
    public static void main(String[] args) {
        AddToArrayForm addToArrayForm = new AddToArrayForm();
        int[] array = {2, 7, 4};
        int K = 181;

        List<Integer> list = addToArrayForm.addToArrayForm(array, K);
        System.out.println(list);
        List<Integer> list1 = addToArrayForm.addToArrayNum(array, K);
        System.out.println(list1);
    }

    public List<Integer> addToArrayForm(int[] A, int K) {
        // 将数组转换成数字
        StringBuilder builder = new StringBuilder();
        for (int i : A) {
            builder.append(i);
        }
        // 转成字符串
        String s = builder.toString();
        // 转为数字
        BigDecimal bigDecimal = new BigDecimal(s);
        BigDecimal decimal = bigDecimal.add(new BigDecimal(K));
        // 转成数组
        List<Integer> list = new ArrayList<>();
        do {
            // 取模
            BigDecimal[] bigDecimals = decimal.divideAndRemainder(new BigDecimal(10));
            // 转换
            decimal = bigDecimals[0];
            list.add(0, bigDecimals[1].intValue());
        } while (decimal.compareTo(BigDecimal.ZERO) > 0);
        return list;
    }

    /**
     * 速度快的解法
     * @param A
     * @param K
     * @return
     */
    public List<Integer> addToArrayNum(int[] A, int K) {
        // 拿到数组长度
        int length = A.length;
        List<Integer> list = new ArrayList<>(10);
        // 循环遍历
        for (int i = length - 1; i >= 0; --i) {
            // 拿到数字
            int num = A[i];
            // 取K的模
            int m = K % 10;
            // 相加
            int sum = num + m;
            K = K / 10;
            // 是否大于10
            if (sum >= 10) {
                sum = sum - 10;
                // 高位进1
                K++;
            }
            list.add(0, sum);
        }
        // K的长度大于A
        for (; K > 0; K /= 10) {
            list.add(0, K % 10);
        }
        return list;
    }
}
